home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 15 / BBS in a box XV-1.iso / Files / Tele / Pete Johnson / Mehit 3.0.b15<source>.sit / TextFiles.p < prev    next >
Encoding:
Text File  |  1991-07-25  |  11.1 KB  |  430 lines  |  [TEXT/PJMM]

  1. unit TextFiles;
  2.  
  3. interface
  4.  
  5. uses
  6.     Globals, HelloTabby, mehitFile, LogUtils, FileAndStuffIt;
  7.  
  8. procedure ProcessTextFiles;
  9.  
  10. implementation
  11.  
  12. const
  13.     January = 0;
  14.     February = 31;
  15.     March = 59;
  16.     April = 90;
  17.     May = 120;
  18.     June = 151;
  19.     July = 181;
  20.     August = 212;
  21.     September = 243;
  22.     October = 273;
  23.     November = 304;
  24.     December = 334;
  25.  
  26. { ------------------------------------------------------ }
  27.  
  28. function FindDateString (lineString: str255): str255;
  29.  
  30.     var
  31.         tempString: str255;
  32.         slashPos, counter: integer;
  33.         goodDate: boolean;
  34.  
  35.     begin
  36.         goodDate := false;
  37.         slashPos := pos('/', lineString);
  38.         if (slashPos > 0) & (slashPos > 2) & (length(lineString) > (slashPos + 5)) then
  39.             begin
  40.                 goodDate := true;
  41.                 tempString := copy(lineString, slashPos - 2, 8);
  42.                 for counter := 1 to length(tempString) do
  43.                     if not (tempString[counter] in ['0'..'9', '/']) then
  44.                         goodDate := false
  45.             end;
  46.         if goodDate then
  47.             FindDateString := tempString
  48.         else
  49.             FindDateString := ''
  50.     end;
  51.  
  52. { ------------------------------------------------------ }
  53.  
  54. function FindDayOfYear (Now: DateTimeRec): integer;
  55.  
  56.     var
  57.         WhatDay: integer;
  58.  
  59.     begin
  60.         with Now do
  61.             begin
  62.                 case Month of
  63.                     1: 
  64.                         whatDay := January + Day;
  65.                     2: 
  66.                         whatDay := February + Day;
  67.                     3: 
  68.                         whatDay := March + Day;
  69.                     4: 
  70.                         whatDay := April + Day;
  71.                     5: 
  72.                         whatDay := May + Day;
  73.                     6: 
  74.                         whatDay := June + Day;
  75.                     7: 
  76.                         whatDay := July + Day;
  77.                     8: 
  78.                         whatDay := August + Day;
  79.                     9: 
  80.                         whatDay := September + Day;
  81.                     10: 
  82.                         whatDay := October + Day;
  83.                     11: 
  84.                         whatDay := November + Day;
  85.                     12: 
  86.                         whatDay := December + Day;
  87.                 end;        {case}
  88.                 if Year mod 4 = 0 then
  89.                     if (Month > 2) | ((Month = 2) & (Day > 28)) then
  90.                         whatDay := succ(whatDay);
  91.             end;
  92.         FindDayOfYear := whatDay;
  93.     end;
  94.  
  95. { ------------------------------------------------------ }
  96.  
  97. procedure DecrementDay (var DayOfYear, Year: integer);
  98.  
  99.     begin
  100.         if dayOfYear > 1 then
  101.             dayOfYear := pred(dayOfYear)
  102.         else
  103.             begin
  104.                 Year := pred(Year);
  105.                 if Year mod 4 = 0 then
  106.                     dayOfYear := 366
  107.                 else
  108.                     dayOfYear := 365
  109.             end
  110.     end;
  111.  
  112. { ------------------------------------------------------ }
  113.  
  114. function TwoDigits (ANumber: integer): str255;
  115.  
  116.     var
  117.         aString: str255;
  118.  
  119.     begin
  120.         aString := stringOf(ANumber : 1);
  121.         if length(aString) < 2 then
  122.             aString := concat('0', aString);
  123.         TwoDigits := aString
  124.     end;
  125.  
  126. { ------------------------------------------------------ }
  127.  
  128. function MakeDateString (Month, Day, Year: integer): str255;
  129.  
  130.     begin
  131.         MakeDateString := concat(TwoDigits(Month), '/', TwoDigits(Day), '/', TwoDigits(Year - 1900))
  132.     end;
  133.  
  134. { ------------------------------------------------------ }
  135.  
  136. function DaysAgoString (DaysAgo: integer): str255;
  137.  
  138.     var
  139.         Now: dateTimeRec;
  140.         dayOfYear, counter: integer;
  141.         tempLong: longint;
  142.  
  143.     begin
  144.         GetTime(Now);
  145.         dayOfYear := FindDayOfYear(Now);
  146.         for counter := 1 to DaysAgo do
  147.             DecrementDay(dayOfYear, Now.Year);
  148.         Now.Month := 1;
  149.         Now.Day := DayOfYear;
  150.         Date2Secs(Now, tempLong);
  151.         Secs2Date(tempLong, Now);
  152.         DaysAgoString := MakeDateString(Now.Month, Now.Day, Now.Year)
  153.     end;
  154.  
  155. { ------------------------------------------------------ }
  156.  
  157. function IsLess (string1, string2: str255): boolean;    {compares two mm/dd/yy date strings}
  158.  
  159.     var
  160.         tempString: str255;
  161.  
  162.     begin
  163.         while pos('/', string1) > 0 do
  164.             delete(string1, pos('/', string1), 1);                {mmddyy}
  165.         tempString := copy(string1, (length(string1) - 1), 2);    {copy year}
  166.         string1 := copy(string1, 1, length(string1) - 2);        {lop off year}
  167.         string1 := concat(tempstring, string1);                {begin with year: yymmdd}
  168.  
  169.         while pos('/', string2) > 0 do
  170.             delete(string2, pos('/', string2), 1);                {mmddyy}
  171.         tempString := copy(string2, (length(string2) - 1), 2);    {copy year}
  172.         string2 := copy(string2, 1, length(string2) - 2);        {lop off year}
  173.         string2 := concat(tempstring, string2);                {begin with year: yymmdd}
  174.         if string1 < string2 then
  175.             IsLess := true
  176.         else
  177.             IsLess := false
  178.     end;
  179.  
  180. { ------------------------------------------------------ }
  181.  
  182. procedure DoMonthlyArc (LogPath, Nickname: str255; when: integer; StuffMode: StuffOpts);
  183.  
  184.     var
  185.         MonthlyName, tempName: str255;
  186.         ThisMonth, ThisYear, namePos: integer;
  187.         Today: DateTimeRec;
  188.  
  189.     begin
  190.         GetTime(Today);
  191.         if Today.Day = when then
  192.             begin
  193.                 if MultiFinder then
  194.                     IgnoreBool := WaitNextEvent(EveryEvent, TabbyEventRec, sleep, nil);
  195.                 if Today.Month = 1 then
  196.                     begin
  197.                         ThisMonth := 12;
  198.                         ThisYear := pred(Today.Year)
  199.                     end
  200.                 else
  201.                     begin
  202.                         ThisMonth := pred(Today.Month);
  203.                         ThisYear := Today.Year;
  204.                     end;
  205.  
  206.                 tempName := concat(GetPath(LogPath), Nickname);
  207.                 MonthlyName := concat(tempName, ' ', TwoDigits(ThisMonth), '/', TwoDigits(ThisYear mod 100));
  208.                 Err := Rename(LogPath, DefaultVol, MonthlyName);
  209.                 Err := Create(LogPath, DefaultVol, DefaultsPtr^.TEXTType, 'TEXT');
  210.                 if (StuffMode in [DoNone..DoBetter]) then
  211.                     StuffOne(MonthlyName, StuffMode, true);
  212.                 UnloadSeg(@StuffOne)
  213.             end        {if Today.Day = when}
  214.     end;
  215.  
  216. { ------------------------------------------------------ }
  217.  
  218. procedure ResetLog (LogPath, Nickname: STR255; LogDays, ArcDays: integer; Daily: boolean; StuffMode: StuffOpts);
  219.  
  220. {    If Daily is false, then do monthly archive.                }
  221.  
  222.     const
  223.         BUFSIZE = 16384;
  224.  
  225.     var
  226.         TheLogArchive, LogString, TheTempFile, LogDateString, ArcDateString, tempString: STR255;
  227.         lineDateString: str255;
  228.         LogRef, LogArcRef, TempRef: integer;
  229.         fndrInfo: FInfo;
  230.         Quit: boolean;
  231.         LogPos, logicalEOF, gulp: longint;
  232.         bufPtr: ptr;
  233.  
  234.     begin
  235.         bufPtr := newPtr(BUFSIZE);
  236.         LogDateString := DaysAgoString(LogDays - 1);                { string of earliest valid date }
  237.         ArcDateString := DaysAgoString(ArcDays + LogDays - 1);        { string of earliest valid date }
  238.  
  239.         if MultiFinder then
  240.             IgnoreBool := WaitNextEvent(EveryEvent, TabbyEventRec, sleep, nil);
  241.  
  242.         Err := FSOpen(LogPath, DefaultVol, LogRef);
  243.         if err = NoErr then
  244.             Err := GetEOF(LogRef, logicalEOF);
  245.         if (logicalEOF > 0) & (err = NoErr) then
  246.             begin
  247.                 TheLogArchive := concat(LogPath, '.Arch');
  248.                 Err := GetFInfo(TheLogArchive, DefaultVol, fndrInfo);
  249.                 if Err = noErr then
  250.                     begin
  251.                         with fndrInfo do
  252.                             begin
  253.                                 fndrInfo.fdType := 'TEXT';
  254.                                 fndrInfo.fdCreator := DefaultsPtr^.TextType
  255.                             end;
  256.                         Err := SetFInfo(TheLogArchive, DefaultVol, fndrInfo);
  257.                     end
  258.                 else
  259.                     Err := Create(TheLogArchive, DefaultVol, DefaultsPtr^.TEXTType, 'TEXT');
  260.                 Err := FSOpen(TheLogArchive, DefaultVol, LogArcRef);
  261.                 Err := SetFPos(LogArcRef, fsFromLEOF, 0);
  262.  
  263.                 Quit := false;
  264.  
  265.                 while (not AtEOF(LogRef)) & (not Quit) & (Err = NoErr) do
  266.                     begin
  267.                         if MultiFinder then
  268.                             IgnoreBool := WaitNextEvent(EveryEvent, TabbyEventRec, sleep, nil);
  269.                         Err := ReadALine(LogRef, LogString);
  270.                         lineDateString := FindDateString(LogString);
  271.                         if (Err = NoErr) then
  272.                             if (lineDateString = '') | (IsLess(lineDateString, LogDateString)) then
  273.                                 Err := WrLn(LogArcRef, LogString)
  274.                             else
  275.                                 Quit := true;
  276.                     end;
  277.  
  278.                 Err := FSClose(LogArcRef);
  279.                 TheTempFile := concat(LogPath, '.$$$');
  280.                 Err := FSDelete(TheTempFile, DefaultVol);
  281.                 Err := Create(TheTempFile, DefaultVol, DefaultsPtr^.TEXTType, 'TEXT');
  282.                 Err := FSOpen(TheTempFile, DefaultVol, TempRef);
  283.  
  284.                 if pos(LogDateString, LogString) > 0 then
  285.                     Err := WrLn(TempRef, LogString);
  286.  
  287.                 gulp := BUFSIZE;
  288.                 while (Err = NoErr) & (not AtEOF(LogRef)) & (gulp = BUFSIZE) do
  289.                     begin
  290.                         if MultiFinder then
  291.                             IgnoreBool := WaitNextEvent(EveryEvent, TabbyEventRec, sleep, nil);
  292.                         Err := FSRead(LogRef, gulp, bufPtr);
  293.                         Err := FSWrite(TempRef, gulp, bufPtr)
  294.                     end;
  295.  
  296.                 Err := FSClose(TempRef);
  297.                 Err := FSClose(LogRef);
  298.                 Err := FSDelete(LogPath, DefaultVol);
  299.                 Err := Rename(TheTempFile, DefaultVol, LogPath);
  300.  
  301.     {trim archives if necessary}
  302.  
  303.                 if Daily then
  304.                     begin
  305.                         if MultiFinder then
  306.                             IgnoreBool := WaitNextEvent(EveryEvent, TabbyEventRec, sleep, nil);
  307.                         TheTempFile := concat(TheLogArchive, '.$$$');
  308.                         Err := FSDelete(TheTempFile, DefaultVol);
  309.                         Err := Create(TheTempFile, DefaultVol, DefaultsPtr^.TEXTType, 'TEXT');
  310.                         Err := FSOpen(TheTempFile, DefaultVol, TempRef);
  311.  
  312.                         Err := FSOpen(TheLogArchive, DefaultVol, LogArcRef);
  313.  
  314.                         repeat
  315.                             if MultiFinder then
  316.                                 IgnoreBool := WaitNextEvent(EveryEvent, TabbyEventRec, sleep, nil);
  317.                             Err := ReadALine(LogArcRef, LogString);
  318.                         until (Err <> NoErr) | (not (IsLess(FindDateString(LogString), ArcDateString))) | (AtEOF(LogArcRef));
  319.                         if Err = NoErr then
  320.                             Err := WrLn(TempRef, LogString);
  321.  
  322.                         gulp := BUFSIZE;
  323.                         while (Err = NoErr) & (gulp = BUFSIZE) & (not AtEOF(LogArcRef)) do
  324.                             begin
  325.                                 if MultiFinder then
  326.                                     IgnoreBool := WaitNextEvent(EveryEvent, TabbyEventRec, sleep, nil);
  327.                                 Err := FSRead(LogArcRef, gulp, bufPtr);
  328.                                 Err := FSWrite(TempRef, gulp, bufPtr)
  329.                             end;
  330.  
  331.                         Err := FSClose(TempRef);
  332.                         Err := FSClose(LogArcRef);
  333.                         Err := FSDelete(TheLogArchive, DefaultVol);
  334.                         Err := Rename(TheTempFile, DefaultVol, TheLogArchive)
  335.                     end        {if Daily}
  336.                 else
  337.                     DoMonthlyArc(TheLogArchive, Nickname, LogDays, StuffMode);
  338.  
  339.                 if bufPtr <> nil then
  340.                     begin
  341.                         DisposPtr(bufPtr);
  342.                         bufPtr := nil
  343.                     end
  344.             end {if (logicalEOF > 0) & (Err = NoErr)}
  345.         else
  346.             Err := FSClose(LogRef)
  347.     end;
  348.  
  349. { ------------------------------------------------------ }
  350.  
  351. procedure ProcessCL;
  352.  
  353.     var
  354.         CLDays, CLADays: integer;
  355.         DoCLADays: boolean;
  356.         DoCLAStuff: StuffOpts;
  357.  
  358.     begin
  359.         CLDays := DefaultsPtr^.CLDays;
  360.         CLADays := DefaultsPtr^.CLADays;
  361.         DoCLADays := DefaultsPtr^.DoCLADays;
  362.         DoCLAStuff := DefaultsPtr^.DoCLAStuff;
  363.         ResetLog(CLPath, 'CL', CLDays, CLADays, DoCLADays, DoCLAStuff)
  364.     end;
  365.  
  366. { ------------------------------------------------------ }
  367.  
  368. procedure ProcessTL;
  369.  
  370.     var
  371.         TLDays, TLADays: integer;
  372.         DoTLADays: boolean;
  373.         DoTLAStuff: StuffOpts;
  374.  
  375.     begin
  376.         TLDays := DefaultsPtr^.TLDays;
  377.         TLADays := DefaultsPtr^.TLADays;
  378.         DoTLADays := DefaultsPtr^.DoTLADays;
  379.         DoTLAStuff := DefaultsPtr^.DoTLAStuff;
  380.         ResetLog(concat(gDefaultPath, 'Tabby:Tabby Log'), 'TL', TLDays, TLADays, DoTLADays, DoTLAStuff)
  381.     end;
  382.  
  383. { ------------------------------------------------------ }
  384.  
  385. procedure ProcessTextFiles;
  386.  
  387.     var
  388.         tempString: str255;
  389.         oldGrafPort: grafptr;
  390.  
  391.     begin
  392.         TextFont(0);
  393.         TextSize(12);
  394.         ForeColor(BlueColor);
  395.         tempString := 'mehitabel: doing logsā€¦';
  396.         EraseRect(StatusRect);
  397.         TextBox(Pointer(ord(@TempString) + 1), length(TempString), StatusRect, teJustLeft);
  398.         with DefaultsPtr^ do
  399.             begin
  400.                 if ResetCL then
  401.                     begin
  402.                         if MultiFinder then
  403.                             IgnoreBool := WaitNextEvent(EveryEvent, TabbyEventRec, sleep, nil);
  404.                         tempString := 'callerlog';
  405.                         EraseRect(MsgNoRect);
  406.                         TextFont(Geneva);
  407.                         TextSize(9);
  408.                         ForeColor(RedColor);
  409.                         TextBox(Pointer(ord(@TempString) + 1), length(TempString), MsgNoRect, teJustRight);
  410.                         ProcessCL
  411.                     end;
  412.                 if ResetTL then
  413.                     begin
  414.                         if MultiFinder then
  415.                             IgnoreBool := WaitNextEvent(EveryEvent, TabbyEventRec, sleep, nil);
  416.                         tempString := 'tabby log';
  417.                         EraseRect(MsgNoRect);
  418.                         TextFont(Geneva);
  419.                         TextSize(9);
  420.                         ForeColor(RedColor);
  421.                         TextBox(Pointer(ord(@TempString) + 1), length(TempString), MsgNoRect, teJustRight);
  422.                         ProcessTL
  423.                     end
  424.             end;
  425.         setport(oldGrafPort);
  426.     end;
  427.  
  428. { ------------------------------------------------------ }
  429.  
  430. end.